package cn.tedu.thread;

public class WaitNotifyAllDemo {
    public static void main(String[] args) {
        //创建代表商品类的对象
        Product p=new Product();
        //创建线程对象
        new Thread(new Productor1(p)).start();
        new Thread(new Productor1(p)).start();
        new Thread(new Productor1(p)).start();
        new Thread(new Consumer1(p)).start();
        new Thread(new Consumer1(p)).start();
        new Thread(new Consumer1(p)).start();
    }
}
//定义类---描述线程任务信息（生产商品）
//生产者
class Productor1 implements Runnable{

    //声明商品类的对象
    private Product p;

    //保证创建所有的生产者对象共享同一个商品类对象
    //有参构造
    public Productor1(Product p){
        this.p=p;
    }

    //重写方法---生产商品的过程
    @Override
    public void run() {
        //保证一直生产
        while (true) {
            //同步代码块锁
            synchronized (p) {
                //
                while (p.getFlag()==true)
                    //线程等待
                    try {
                        p.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                //最大支持生产的商品数量
                //1000-剩余商品数量
                int max = 1000 - p.getCount();
                //本次随机生产的商品数量
                int count = (int) (Math.random() * (max + 1));
                //更新剩余商品数量
                //上次剩余+本次生产
                p.setCount(p.getCount() + count);
                //输出
                System.out.println("本次生产" + count + "个商品，还剩余"
                        + p.getCount() + "个商品...");

                //休眠
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //唤醒等待线程对象
                //p.notify();//随机
                //唤醒所有等待线程对象
                p.notifyAll();
                //改变布尔值
                p.setFlag(true);
            }
        }
    }
}


//定义类---描述线程任务信息（消费商品）
//消费者
class Consumer1 implements Runnable{
    //声明商品类的对象
    private Product p;

    //保证创建所有的生产者对象共享同一个商品类对象
    //有参构造
    public Consumer1(Product p){
        this.p=p;
    }

    //重写方法---描述任务信息（消费商品过程）
    @Override
    public void run() {
        //保证一直消费
        while (true){
            //同步代码块锁
            synchronized (p){
                //
                while (p.getFlag()==false)
                    //线程等待
                    try {
                        p.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                //随机消费商品数量
                int count=(int) (Math.random()*(p.getCount()+1));
                //更新剩余商品数量
                p.setCount(p.getCount()-count);
                //输出
                System.out.println("本次消费" + count + "个商品，还剩余"
                        + p.getCount() + "个商品...");

                //休眠
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }



                //唤醒等待的线程对象
                //p.notify();//随机
                //唤醒所有等待线程对象
                p.notifyAll();
                //改变布尔值
                p.setFlag(false);
            }
        }
    }
}